package com.xinqi.modules.chat.chat.group.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.base.response.R;
import com.xinqi.common.base.user.Account;
import com.xinqi.common.mybatis.data.service.BaseService;
import com.xinqi.modules.chat.chat.group.domain.ChatGroupEntity;
import com.xinqi.modules.chat.chat.group.dto.req.*;
import com.xinqi.modules.chat.chat.group.dto.rsp.*;

import java.util.List;

/**
 * 群组表服务层
 *
 * @author: system
 * @date: 2023/01/12
 */
public interface ChatGroupService extends BaseService<ChatGroupEntity> {

    /**
     * 获取我的群聊
     *
     * @param operationUserId
     * @return
     */
    List<ChatGroupResultDTO> listByUserId(Long operationUserId, String keywords);

    /**
     * 获取我的群聊
     *
     * @param query
     * @return
     */
    List<ChatGroupResultDTO> listByQuery(ChatGroupQueryDTO query);

    /**
     * 我的群列表 -- 分页
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<ChatGroupResultDTO> pageByQuery(Param pageable, ChatGroupQueryDTO query);

    /**
     * 后台管理 -- 群列表分页
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<ChatGroupAdminResultDTO> pageAdmin(Param pageable, ChatGroupAdminQueryDTO query);

    /**
     * 根据群聊ID获取群详情
     * 含群成员
     *
     * @param groupId
     * @param operationUserId
     * @return
     */
    ChatGroupResultDTO findByGroupIdIncludingUser(String groupId, Long operationUserId);

    /**
     * 根据群聊ID获取群详情
     *
     * @param groupId
     * @param operationUserId
     * @return
     */
    ChatGroupResultDTO findByGroupId(String groupId, Long operationUserId);


    /**
     * 根据群聊获取群聊信息
     *
     * @param query
     * @return
     */
    List<ChatGroupInfoResultDTO> groupInfoByGroupId(ChatGroupQueryDTO query);

    /**
     * 用户创建群组
     *
     * @param user 当前用户
     * @param dto  初始成员id集合
     * @return ChatGroupResultDTO
     */
    ChatGroupResultDTO userCreate(Account user, ChatUserGroupCreateDTO dto);

    /**
     * 班级创建群
     *
     * @param user 当前用户
     * @param dto  ChatClassUserGroupCreateDTO
     * @return ChatGroupResultDTO
     */
    ChatGroupResultDTO classCreate(Account user, ChatClassUserGroupCreateDTO dto);

    /**
     * 管理端创建群
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean createAdmin(Account user, ChatGroupAdminCreateDTO dto);

    /**
     * 管理端修改群
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean editAdmin(Account user, ChatGroupAdminEditDTO dto);

    /**
     * 设置群（仅管理和群主能操作）
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean setChatGroup(Account user, ChatGroupUpdateDTO dto);

    /**
     * 解散群(仅群主可操作)
     *
     * @param user user
     * @param id   id
     * @return Boolean
     */
    Boolean disbandChatGroup(Account user, Long id);

    /**
     * 解散班级群(仅群主可操作)
     *
     * @param classId 班级ID
     * @return
     */
    Boolean classDisbandGroup(Long classId);

    /**
     * 管理端解散群
     *
     * @param user
     * @param groupId
     * @return
     */
    Boolean disbandAdmin(Account user, String groupId);

    /**
     * 转让群(仅群主可操作)
     *
     * @param user user
     * @param dto  ChatGroupUpdateDTO
     * @return Boolean
     */
    Boolean shiftChatGroup(Account user, ChatGroupUpdateDTO dto);

    /**
     * 转让班级群(仅群主可操作)
     *
     * @param classId 班级ID
     * @param userId  转让接受用户ID
     * @return
     */
    Boolean classShiftGroup(Long classId, Long userId);

    /**
     * 账号注销（聊天板块变动）
     *
     * @param userId
     * @return
     */
    Boolean accountCancel(Long userId);

    /**
     * 群组汇总列表只包含头像名称和会话ID
     *
     * @param dto
     * @return
     */
    List<ConversationResultDTO> selectConversation(ConversationSelectDTO dto);

    /**
     * 根据班级ID获取群组信息
     *
     * @param classId
     * @return
     */
    R<ChatGroupUserResultDTO> groupInfoByClass(Long userId, Long classId);

    /**
     * 根据班级查询班级群
     *
     * @param userId
     * @param groupId 群Id(融云)
     * @return ChatGroupUserResultDTO
     */
    ChatGroupUserInfoResultDTO infoByUserIdAndGroupId(Long userId, String groupId);

    /**
     * 管理端群详情
     *
     * @param groupId
     * @return
     */
    ChatGroupAdminResultDTO infoAdmin(String groupId);

    /**
     * 查询个人信息
     *
     * @param userId
     * @return
     */
    ShareSelectResultDTO getSharePersonalInfo(Long userId);
}
